<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<script>
  /**
   * @description 把 error 信息转换成 JSON 字符串形式
   *
   * @param error {Error|any} 错误信息
   * */
  function errorStringify(error) {
    if (error) {
      if (error instanceof Error) {
        const {name, message, stack} = error;
        return JSON.stringify({
          name,
          message,
          stack
        })
      } else {
        // JSON.stringify 有可能返回 undefined，例如 error 是函数、Symbol
        return JSON.stringify(error) || error.toString()
      }
    } else {
      return `${error}`
    }
  }

  function fn() {
    try {
      const str = 123
      str.concat('e')
    } catch (error) {
      console.log(error)
      console.log('=====')
      console.log(errorStringify(error))
    }
  }

  fn()

  // 测试
  console.log('--------------')
  console.log(errorStringify(null), typeof errorStringify(null)) // null string
  console.log(errorStringify(new Error('error'))) // {"name":"Error","message":"error","stack":"Error: error ...
  console.log(errorStringify(undefined), typeof errorStringify(undefined)) // undefined string
  console.log(errorStringify(0), typeof errorStringify(0)) // 0 string
  console.log(errorStringify(2), typeof errorStringify(2)) // 2 string
  console.log(errorStringify(fn)) // function fn() ...
  console.log(errorStringify(Symbol('aa'))) // Symbol(aa)
  console.log(errorStringify(new Map([[1,2]]))) // {}
  console.log(errorStringify(new Set([1,2]))) // {}
  console.log(errorStringify({})) // {}
  console.log(errorStringify([])) // []

</script>
</body>
</html>